package com.chenjt.jvm.first.four_stack.DynamicLinking;

/**
 * 面试题：
 * 方法中定义的局部变量是否线程安全？具体问题具体分析
 *
 * 何为线程安全？
 *  如果只有一个线程才可以操作此数据，则必是线程安全的。
 *  如果有多个线程操作此数据，则此数据是共享数据。
 *      如果不考虑同步机制（如：synchronized）的话，会存在线程安全问题。
 *
 * @author chenjt
 * @date 2025/6/7 10:16
 */
public class StringBuilderTest {


    /**
     * s1的声明方式是线程安全的
     * （
     *  因为s1是在方法内部使用的，
     *  并且在方法内部消亡了，没有返回出去，
     *  所以是线程安全的
     * ）
     */
    public static void method1(){
        // StringBuffer：线程安全
        // StringBuilder：线程不安全
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        // ...
    }

    /**
     * stringBuilder的操作过程：是线程不安全的
     * （
     * stringBuilder是传进来的，可能是被多个线程共用的，
     * 共用的内容没考虑线程安全机制则存在线程不安全问题
     * ）
     * @param stringBuilder
     */
    public static void method2(StringBuilder stringBuilder){
        stringBuilder.append("a");
        stringBuilder.append("b");
        // ...
    }

    /**
     * s1的操作：是线程不安全的
     * （
     *  因为s1返回出去了，可能是被多个线程共用的
     * ）
     * @return
     */
    public static StringBuilder method3(){
        // StringBuilder：线程不安全
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        // ...
        return s1;
    }


    /**
     * s1的操作：是线程安全的
     * （
     *  s1已经在内部消亡了，所以s1是线程安全的，
     *  而返回的String是线程不安全的，可能会被多个线程共用
     * ）
     * @return
     */
    public static String method4(){
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        return s1.toString();
    }


    public static void main(String[] args) {
        StringBuilder s = new StringBuilder();

        new Thread(()->{
            s.append("a");
            s.append("b");
        }).start();

        method2(s);
    }



}
